Source: Low-Income Energy Affordability Data, 2018 Update
The US Department of Energy’s Low-Income Energy Affordability Data (LEAD) shows energy expenditures and energy burdens for households. This particular data, pulled from the 2018 Area Median Income data, also breaks households into income brackets. The income brackets are as a percentage of the area’s median income (AMI), where 100% indicates that household income is equivalent to the AMI. The income brackets in this data are 0-30%, 30-60%, 60-80%, 80-100%, and 100%+.
glimpse(lead)
## Rows: 11
## Columns: 39
## $ FIP <dbl> 51001090100, 51001090200, 51001090300, 510010…
## $ state_fip <dbl> 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51
## $ county_fip <chr> "001", "001", "001", "001", "001", "001", "00…
## $ tract_fip <chr> "090100", "090200", "090300", "090400", "0905…
## $ county <chr> "Accomack", "Accomack", "Accomack", "Accomack…
## $ totalinc <dbl> 106773487, 129612461, 61442032, 120047897, 53…
## $ totalelep <dbl> 6143964, 6615628, 2167116, 4461609, 2081862, …
## $ totalgas <dbl> 955390.4, 2182387.7, 709611.5, 1232994.8, 731…
## $ totalother <dbl> 321101.4, 516012.6, 311333.1, 410918.6, 43256…
## $ averageburden <dbl> 6.949718, 7.186059, 5.188728, 5.085905, 6.031…
## $ avg_hh_exp <dbl> 4748.120, 3657.473, 3077.275, 3053.370, 3110.…
## $ lowburden <dbl> 683.9598, 1096.5446, 440.7706, 1058.9761, 462…
## $ highburden <dbl> 184.2558, 483.4608, 194.3784, 394.9814, 157.6…
## $ veryhighburden <dbl> 341.3380, 634.9627, 208.8109, 400.2121, 180.2…
## $ extremelyhighburden <dbl> 291.1445, 300.4294, 149.9686, 201.2892, 200.1…
## $ totalunits <dbl> 1500.6981, 2515.3974, 993.9284, 2055.4588, 10…
## $ numberburdened <dbl> 816.7382, 1418.8528, 553.1579, 996.4827, 538.…
## $ percentburdened <dbl> 54.42389, 56.40671, 55.65369, 48.47982, 53.78…
## $ total_0_30 <dbl> 167.4056, 263.7055, 186.7433, 309.1969, 202.3…
## $ total_30_60 <dbl> 182.5965, 390.5556, 153.4957, 391.8459, 155.7…
## $ total_60_80 <dbl> 136.92566, 366.98719, 144.03470, 238.49260, 9…
## $ total_80_100 <dbl> 161.44690, 327.18867, 96.45968, 161.76691, 93…
## $ total_over_100 <dbl> 852.3234, 1166.9604, 413.1950, 954.1566, 453.…
## $ burdened_0_30 <dbl> 167.4056, 263.7055, 186.7433, 304.8229, 202.3…
## $ burdened_30_60 <dbl> 182.5965, 369.1552, 151.0950, 366.3732, 154.2…
## $ burdened_60_80 <dbl> 135.96044, 324.84586, 129.60361, 174.95300, 8…
## $ burdened_80_100 <dbl> 157.32611, 280.91965, 58.84603, 98.76576, 67.…
## $ burdened_over_100 <dbl> 173.44962, 180.22663, 26.86993, 51.56778, 28.…
## $ percent_0_30 <dbl> 100.00000, 100.00000, 100.00000, 98.58538, 10…
## $ percent_30_60 <dbl> 100.00000, 94.52052, 98.43594, 93.49933, 99.0…
## $ percent_60_80 <dbl> 99.29508, 88.51695, 89.98083, 73.35783, 88.88…
## $ percent_80_100 <dbl> 97.44759, 85.85861, 61.00583, 61.05437, 72.21…
## $ percent_over_100 <dbl> 20.350211, 15.444108, 6.502966, 5.404541, 6.3…
## $ total_owners <dbl> 1160.5645, 1820.6219, 676.0099, 1180.9014, 64…
## $ total_renters <dbl> 349.7431, 696.1272, 318.2414, 889.5201, 359.8…
## $ burdened_owners <dbl> 529.8751, 949.5822, 317.8923, 478.9872, 286.2…
## $ burdened_renters <dbl> 286.8631, 469.2706, 235.2655, 517.4956, 251.8…
## $ percent_burdened_owners <dbl> 45.65667, 52.15702, 47.02481, 40.56115, 44.68…
## $ percent_burdened_renters <dbl> 82.02109, 67.41163, 73.92675, 58.17694, 69.98…
meta %>%
mutate(label = paste0(varname, ": ", about)) %>%
select(label) %>%
as.list()
## $label
## [1] "FIP: 11-digit FIPS code (State, County, Tract)"
## [2] "state_fip: 2-digt State FIPS code"
## [3] "county_fip: 3-digit County FIPS code"
## [4] "tract_fip: 6-digit Tract FIPS code"
## [5] "county: County name"
## [6] "totalinc: Aggregated income for the entire census tract"
## [7] "totalelep: Aggregated electric expenditures for the entire census tract"
## [8] "totalgas: Aggregated gas expenditures for the entire census tract"
## [9] "totalother: Aggregated other energy expenditures for the entire census tract"
## [10] "averageburden: Average household energy burden; energy burden is defined as the percent of income spent on energy"
## [11] "avg_hh_exp: Average household yearly expenditure on electric + gas + other energy"
## [12] "lowburden: Number of households with less than 6% energy burden"
## [13] "highburden: Number of households with 6-10% energy burden"
## [14] "veryhighburden: Number of households with 10-20% energy burden"
## [15] "extremelyhighburden: Number of households with greater than 20% energy burden"
## [16] "totalunits: Total number of housing units in the census tract"
## [17] "numberburdened: Burdened households are those that bear at least a 6% energy burden (fall in the high, very high, or extremely high burden categories)"
## [18] "percentburdened: Percent of households that are energy burdened (numberburdened/totalunits)"
## [19] "total_0_30: Number of households with incomes that are 0-30% of the Area Median Income"
## [20] "total_30_60: Number of households with incomes that are 30-60% of the Area Median Income"
## [21] "total_60_80: Number of households with incomes that are 60-80% of the Area Median Income"
## [22] "total_80_100: Number of households with incomes that are 80-100% of the Area Median Income"
## [23] "total_over_100: Number of households with incomes that are more than 100% of the Area Median Income"
## [24] "burdened_0_30: Number of households in the 0-30% AMI range that are energy burdened"
## [25] "burdened_30_60: Number of households in the 30-60% AMI range that are energy burdened"
## [26] "burdened_60_80: Number of households in the 60-80% AMI range that are energy burdened"
## [27] "burdened_80_100: Number of households in the 80-100% AMI range that are energy burdened"
## [28] "burdened_over_100: Number of households in the 100%+ AMI range that are energy burdened"
## [29] "percent_0_30: Percent of households in the 0-30% AMI range that are energy burdened (burdened_0_30/total_0_30)"
## [30] "percent_30_60: Percent of households in the 30-60% AMI range that are energy burdened (burdened_30_60/total_30_60)"
## [31] "percent_60_80: Percent of households in the 60-80% AMI range that are energy burdened (burdened_60_80/total_60_80)"
## [32] "percent_80_100: Percent of households in the 80-100% AMI range that are energy burdened (burdened_80_100/total_80_100)"
## [33] "percent_over_100: Percent of households in the 100%+ AMI range that are energy burdened (burdened_over_100/total_over_100)"
## [34] "total_owners: Total number of households that are owned in the census tract"
## [35] "total_renters: Total number of households that are rented in the census tract"
## [36] "burdened_owners: Number of owned households that are energy burdened"
## [37] "burdened_renters: Number of rented households that are energy burdened"
## [38] "percent_burdened_owners: Percent of owned households that are energy burdened (burdened_owners/total_owners)"
## [39] "percent_burdened_renters: Percent of rented households that are energy burdened (burdened_renters/total_renters)"
Summary of all non-missing variables:
lead %>% select(-c(FIP:county)) %>%
select(where(~is.numeric(.x) && !is.na(.x))) %>%
as.data.frame() %>%
stargazer(., type = "text", title = "Summary Statistics", digits = 1,
summary.stat = c("mean", "sd", "min", "median", "max"))
##
## Summary Statistics
## ===========================================================================================
## Statistic Mean St. Dev. Min Median Max
## -------------------------------------------------------------------------------------------
## totalinc 99,792,683.0 26,921,352.0 53,813,976.0 106,773,487.0 129,612,461.0
## totalelep 3,984,222.0 1,430,540.0 2,081,862.0 3,807,970.0 6,615,628.0
## totalgas 1,098,016.0 430,572.4 709,611.5 955,390.4 2,182,388.0
## totalother 404,038.2 87,880.4 307,947.2 399,768.1 544,452.8
## averageburden 5.5 0.9 4.6 5.2 7.2
## avg_hh_exp 3,263.6 547.9 2,711.9 3,107.8 4,748.1
## lowburden 858.3 257.7 440.8 957.0 1,140.5
## highburden 261.2 103.9 157.6 234.1 483.5
## veryhighburden 314.8 124.8 180.2 289.6 635.0
## extremelyhighburden 221.8 53.1 143.5 231.9 300.4
## totalunits 1,656.2 454.6 993.9 1,788.0 2,515.4
## numberburdened 797.9 248.6 538.1 774.7 1,418.9
## percentburdened 48.5 6.4 39.1 48.5 56.4
## total_0_30 235.8 50.4 167.4 244.8 309.2
## total_30_60 239.9 85.3 153.5 196.9 391.8
## total_60_80 187.1 80.6 95.6 149.1 367.0
## total_80_100 168.7 62.5 93.4 161.6 327.2
## total_over_100 824.8 241.2 413.2 868.9 1,167.0
## burdened_0_30 234.1 48.7 167.4 244.8 306.9
## burdened_30_60 230.1 76.4 151.1 196.5 369.2
## burdened_60_80 159.6 69.7 85.0 137.4 324.8
## burdened_80_100 119.9 62.1 58.8 98.8 280.9
## burdened_over_100 54.2 61.5 14.8 29.0 180.2
## percent_0_30 99.4 1.6 95 100 100
## percent_30_60 96.6 3.0 92 96.3 100
## percent_60_80 85.7 9.7 65.4 88.5 99.3
## percent_80_100 69.1 13.0 56.8 63.8 97.4
## percent_over_100 6.4 6.1 1.5 4.9 20.4
## total_owners 1,129.8 337.3 640.5 1,160.6 1,820.6
## total_renters 533.0 173.3 318.2 499.0 889.5
## burdened_owners 472.4 179.1 286.2 461.5 949.6
## burdened_renters 325.4 93.3 235.3 286.9 517.5
## percent_burdened_owners 41.8 6.2 31.9 42.7 52.2
## percent_burdened_renters 62.6 10.0 51.2 61.0 82.0
## -------------------------------------------------------------------------------------------
Visual distributions of the data, shown with histograms and scatterplots
lead %>% select(FIP, percentburdened) %>%
pivot_longer(-FIP, names_to = "measure", values_to = "value") %>%
ggplot(aes(x = value, fill = measure)) +
geom_histogram(binwidth=2) +
xlab("Percent of households that are burdened across tracts") +
guides(fill = "none")
lead %>% select(FIP, percent_0_30:percent_over_100) %>%
pivot_longer(-FIP, names_to = "measure", values_to = "value") %>%
ggplot(aes(x = value, fill = measure)) +
geom_histogram() +
facet_wrap(~measure, scales = "free") +
xlab("Percent of households burdened across tracts") +
scale_fill_discrete(labels = c("0-30% AMI", "30-60% AMI", "60-80% AMI", "80-100% AMI", "100%+ AMI"))
lead %>% select(FIP, percent_burdened_owners, percent_burdened_renters) %>%
pivot_longer(-FIP, names_to = "measure", values_to = "value") %>%
ggplot(aes(x = value, fill = measure)) +
geom_histogram(binwidth = 5) +
facet_wrap(~measure) +
xlab("Percent of households burdened across tracts") +
scale_fill_discrete(labels = c("Owners", "Renters"))
Maps to show the distribution of variables across spatial units
pal <- colorNumeric("Blues", reverse = TRUE, domain = easternshapes$averageburden)
leaflet(easternshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = easternshapes,
fillColor = ~pal(averageburden),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", easternshapes$tract, "<br>",
"Avg. Burden: ", round(easternshapes$averageburden, 2))) %>%
addLegend("bottomright", pal = pal, values = easternshapes$averageburden,
title = "Average Energy Burden", opacity = 0.7)
pal <- colorNumeric("Blues", reverse = FALSE, domain = easternshapes$avg_hh_exp)
leaflet(easternshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = easternshapes,
fillColor = ~pal(avg_hh_exp),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", easternshapes$tract, "<br>",
"Avg. Household Energy Expenditures: ", round(easternshapes$avg_hh_exp, 2))) %>%
addLegend("bottomright", pal = pal, values = easternshapes$avg_hh_exp,
title = "Average Yearly Household Energy Expenditures", opacity = 0.7)
pal <- colorNumeric("Blues", reverse = FALSE, domain = easternshapes$numberburdened)
leaflet(easternshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = easternshapes,
fillColor = ~pal(numberburdened),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", easternshapes$tract, "<br>",
"Number Burdened: ", round(easternshapes$numberburdened, 2))) %>%
addLegend("bottomright", pal = pal, values = easternshapes$numberburdened,
title = "Number of Energy Burdened Households", opacity = 0.7)
pal <- colorNumeric("Blues", reverse = FALSE, domain = easternshapes$percentburdened)
leaflet(easternshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = easternshapes,
fillColor = ~pal(percentburdened),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", easternshapes$tract, "<br>",
"Pct. Burdened: ", round(easternshapes$percentburdened, 2))) %>%
addLegend("bottomright", pal = pal, values = easternshapes$percentburdened,
title = "Percent of Energy Burdened Households", opacity = 0.7)
pal <- colorNumeric("Blues", reverse = FALSE, domain = easternshapes$percent_0_30)
leaflet(easternshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = easternshapes,
fillColor = ~pal(percent_0_30),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", easternshapes$tract, "<br>",
"Pct. Burdened - 0-30% AMI: ", round(easternshapes$percent_0_30, 2))) %>%
addLegend("bottomright", pal = pal, values = easternshapes$percent_0_30,
title = "Percent of Energy Burdened Households", opacity = 0.7)
pal <- colorNumeric("Blues", reverse = FALSE, domain = easternshapes$percent_30_60)
leaflet(easternshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = easternshapes,
fillColor = ~pal(percent_30_60),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", easternshapes$tract, "<br>",
"Pct. Burdened - 30-60% AMI: ", round(easternshapes$percent_30_60, 2))) %>%
addLegend("bottomright", pal = pal, values = easternshapes$percent_30_60,
title = "Percent of Energy Burdened Households", opacity = 0.7)
pal <- colorNumeric("Blues", reverse = FALSE, domain = easternshapes$percent_60_80)
leaflet(easternshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = easternshapes,
fillColor = ~pal(percent_60_80),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", easternshapes$tract, "<br>",
"Pct. Burdened - 60-80% AMI: ", round(easternshapes$percent_60_80, 2))) %>%
addLegend("bottomright", pal = pal, values = easternshapes$percent_60_80,
title = "Percent of Energy Burdened Households", opacity = 0.7)
pal <- colorNumeric("Blues", reverse = FALSE, domain = easternshapes$percent_80_100)
leaflet(easternshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = easternshapes,
fillColor = ~pal(percent_80_100),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", easternshapes$tract, "<br>",
"Pct. Burdened - 80-100% AMI: ", round(easternshapes$percent_80_100, 2))) %>%
addLegend("bottomright", pal = pal, values = easternshapes$percent_80_100,
title = "Percent of Energy Burdened Households", opacity = 0.7)
pal <- colorNumeric("Blues", reverse = FALSE, domain = easternshapes$percent_over_100)
leaflet(easternshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = easternshapes,
fillColor = ~pal(percent_over_100),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", easternshapes$tract, "<br>",
"Pct. Burdened - 100%+ AMI: ", round(easternshapes$percent_over_100, 2))) %>%
addLegend("bottomright", pal = pal, values = easternshapes$percent_over_100,
title = "Percent of Energy Burdened Households", opacity = 0.7)
pal <- colorNumeric("Blues", reverse = FALSE, domain = easternshapes$percent_burdened_renters)
leaflet(easternshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = easternshapes,
fillColor = ~pal(percent_burdened_renters),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", easternshapes$tract, "<br>",
"Pct. of Renters Burdened: ", round(easternshapes$percent_burdened_renters, 2))) %>%
addLegend("bottomright", pal = pal, values = easternshapes$percent_burdened_renters,
title = "Percent of Energy Burdened Rented Households", opacity = 0.7)
pal <- colorNumeric("Blues", reverse = FALSE, domain = easternshapes$percent_burdened_owners)
leaflet(easternshapes) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = easternshapes,
fillColor = ~pal(percent_burdened_owners),
weight = 1,
opacity = 1,
color = "white",
fillOpacity = 0.6,
highlight = highlightOptions(weight = 2, fillOpacity = 0.8, bringToFront = T),
popup = paste0("Tract Number: ", easternshapes$tract, "<br>",
"Pct. of Owners Burdened: ", round(easternshapes$percent_burdened_owners, 2))) %>%
addLegend("bottomright", pal = pal, values = easternshapes$percent_burdened_owners,
title = "Percent of Energy Burdened Owned Households", opacity = 0.7)